package main

import (
	"fmt"
)

// 定义，未来结构体如果要使用，就要有这些数据，数据集合
// type 定义新的类型，类型名称User
type User struct { // 结构体要在包外使用，其类型名称首字母要大写
	// 字段 field、属性property
	Id    int // 属性名，在保外要使用该字段，注意首字母要大写
	name  string
	score float32
}

// 普通函数调用，传 user 类型的值，取值的 name 属性
func getUserNmae(u User) string {
	return u.name
}

// go提供一种语法，让我们不同提供参数就可以访问其属性
// 有 receiver 这种方式的函数称为该 receiver类型的方法
// 按照这种语法扩展方法，实例.方法名(实参)调用时，实例和 receiver 实现了绑定
func (u User) getName() string {
	// return u.name
	return getUserNmae(u)
} // 类型是什么，函数类型，签名是什么

func (u User) getNameWithPrefix(prefix string, parame ...int) string {
	return fmt.Sprintf("[%s--%s]", prefix, u.name)
}

func main() {
	u5 := User{name: "tom", score: 78.5, Id: 200}
	// u5.name .操作符，找到字段值
	fmt.Println(u5.name)
	// 函数返回
	fmt.Println(getUserNmae(u5))
	// method
	fmt.Println(u5.getName())
	fmt.Println(u5.getNameWithPrefix("***", 1, 2, 3, 4, 5))

	var u1 User
	fmt.Println(u1.getNameWithPrefix("###"))
	fmt.Printf("%T\n", u5.getName)
	fmt.Printf("%T\n", User.getName)
	fmt.Printf("%T\n", u5.getNameWithPrefix)

}
